#ifndef M_NRF2401_H
#define M_NRF2401_H "m_nrf2401"

// 寄存器地址
#define M_NRF_REG_CONFIG        0x00 // 配置寄存器
#define M_NRF_REG_EN_AA         0x01 // "自动应答"使能寄存器，配置哪些通道接收数据后自动响应
#define M_NRF_REG_EN_RXADDR     0x02 // "接收地址"使能寄存器，配置哪些通道的地址可用于接收数据
#define M_NRF_REG_SETUP_AW      0x03 // 设置（所有）通道地址宽度寄存器
#define M_NRF_REG_SETUP_RETR    0x04 // 设置重发间隔时间和重发次数寄存器
#define M_NRF_REG_RF_CH         0x05 // 设置射频通道寄存器，配置工作频率
#define M_NRF_REG_RF_SETUP      0x06 // 射频寄存器，配置传输速率和发射功率
#define M_NRF_REG_STATUS        0x07 // 状态寄存器，接收、发送中断状态、重发中断状态、接收数据通道号、数据寄存器满状态等
#define M_NRF_REG_OBSERVE_TX    0x08 // 发送测试寄存器，只读，包含丢包次数和重发次数
#define M_NRF_REG_CD            0x09 // 载波测试寄存器，只读
#define M_NRF_REG_RX_ADDR_P0    0x0A // 数据通道0接收地址寄存器，读写
#define M_NRF_REG_RX_ADDR_P1    0x0B // 数据通道1接收地址寄存器，读写
#define M_NRF_REG_RX_ADDR_P2    0x0C // 数据通道2接收地址寄存器，读写，最低字节写有效，其它字节同P1
#define M_NRF_REG_RX_ADDR_P3    0x0D // 数据通道3接收地址寄存器，读写，最低字节写有效，其它字节同P1
#define M_NRF_REG_RX_ADDR_P4    0x0E // 数据通道4接收地址寄存器，读写，最低字节写有效，其它字节同P1
#define M_NRF_REG_RX_ADDR_P5    0x0F // 数据通道5接收地址寄存器，读写，最低字节写有效，其它字节同P1
#define M_NRF_REG_TX_ADDR       0x10 // 发送地址
#define M_NRF_REG_RX_PW_P0      0x11 // 接收数据通道0有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_RX_PW_P1      0x12 // 接收数据通道1有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_RX_PW_P2      0x13 // 接收数据通道2有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_RX_PW_P3      0x14 // 接收数据通道3有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_RX_PW_P4      0x15 // 接收数据通道4有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_RX_PW_P5      0x16 // 接收数据通道5有效数据宽度寄存器，1~32，0设置不合法
#define M_NRF_REG_FIFO_STATUS   0x17 // FIFO状态寄存器，只读，包括数据接收、发送寄存器满、非满、空、非空等状态
#define M_NRF_REG_TX_PLD             // 发送数据寄存器，未提供地址
#define M_NRF_REG_RX_PLD             // 接收数据寄存器，未提供地址

// 寄存器功能位

#define M_NRF_BIT_CONFIG_MASK_RX_DR     6   // RX_DR中断屏蔽位，1表示屏蔽"收到数据"中断，0表示开启，并在发生中断时IRQ引角为低电平
#define M_NRF_BIT_CONFIG_MASK_TX_DS     5   // TX_DS中断屏蔽位，1表示屏蔽"数据发送完成"中断，0表示开启，并在发生中断时IRQ引角为低电平
#define M_NRF_BIT_CONFIG_MASK_MAX_RT    4   // MAX_RT中断屏蔽位，1表示屏蔽"达到重发次数"中断，0表示开启，并在发生中断时IRQ引角为低电平
#define M_NRF_BIT_CONFIG_EN_CRC         3   // CRC使能，默认为1，如果EN_AA寄存器中任意一位为高，则EN_CRC强迫为高。
#define M_NRF_BIT_CONFIG_CRCO           2   // CRC模式：0->8位CRC校验；1->16位CRC校验
#define M_NRF_BIT_PWR_UP                1   // 1上电；0掉电
#define M_NRF_BIT_PRIM_RX               0   // 1接收模式；0发送模式

#define M_NRF_BIT_EN_AA_P5              5   // 数据通道5自动应答允许，默认为1
#define M_NRF_BIT_EN_AA_P4              4   // 数据通道4自动应答允许，默认为1
#define M_NRF_BIT_EN_AA_P3              3   // 数据通道3自动应答允许，默认为1
#define M_NRF_BIT_EN_AA_P2              2   // 数据通道2自动应答允许，默认为1
#define M_NRF_BIT_EN_AA_P1              1   // 数据通道1自动应答允许，默认为1
#define M_NRF_BIT_EN_AA_P0              0   // 数据通道0自动应答允许，默认为1

#define M_NRF_BIT_EN_RXADDR_P5          5   // 接收数据通道5允许
#define M_NRF_BIT_EN_RXADDR_P4          4   // 接收数据通道4允许
#define M_NRF_BIT_EN_RXADDR_P3          3   // 接收数据通道3允许
#define M_NRF_BIT_EN_RXADDR_P2          2   // 接收数据通道2允许
#define M_NRF_BIT_EN_RXADDR_P1          1   // 接收数据通道1允许，默认为1
#define M_NRF_BIT_EN_RXADDR_P0          0   // 接收数据通道0允许，默认为1

#define M_NRF_BIT_SETUP_AW           0   // 接收/发送地址宽度，占两位，默认为'11'，'00'->无效；'01'->3字节宽度；'10'->4字节宽度；'11'->5字节宽度

#define M_NRF_BIT_SETUP_RETR_ADR        4   // 重发延时，占4位，'0000'等待250+86us；'0001'等待500+86us；'0010'等待750+86us；...'1111'等待4000+86us
#define M_NRF_BIT_SETUP_RETR_ARC        0   // 自动重发计数，占4位，默认'0011'，'0000'禁止重发；'0001'自动重发1次；...'1111'自动重发15次

#define M_NRF_BIT_RF_CH_RF_CH           0   // 工作通道频率，占7位，默认'0000010'

#define M_NRF_BIT_RF_SETUP_PLL_LOCK     4   // PLL_LOCK允许，仅应用于测试模式
#define M_NRF_BIT_RF_SETUP_RF_DR        3   // 传输速率，默认1，0->1Mbps；1->2Mbps
#define M_NRF_BIT_RF_SETUP_RF_PWR       1   // 发射功率，占2位，默认'11'，'00'-18dBm;'01'-12dBm;'10'-6dBm;'11'0dBm;
#define M_NRF_BIT_RF_SETUP_LNA_HCURR    0   // 低噪声放大器增益，默认1

#define M_NRF_BIT_STATUS_RX_DR          6   // 接收数据中断。当收到有效数据后置1，写1清除中断
#define M_NRF_BIT_STATUS_TX_DS          5   // 发送数据完成中断。当数据发送完成后产生中断。如果工作在自动应答模式下，只有当接收到应答信息后置1。写1清除中断
#define M_NRF_BIT_STATUS_MAX_RT         4   // 达到最多生发次数。写1清除中断。如果MAX_RT中断产生则必须清除后系统才能进行通讯
#define M_NRF_BIT_STATUS_RX_P_NO        1   // 接收数据通道号。占3位，000-101：数据通道号；110：未使用；111：RX_FIFO寄存器为空
#define M_NRF_BIT_STATUS_TX_FULL        0   // TX_FIFO寄存器满标志。1满，0未满

#define M_NRF_BIT_FIFO_STATUS_TX_REUSE  6   // 若TX_REUSE=1则当CE位高电平状态时不断发送上一数据包，TX_REUSE通过REUSE_TX_PL设置，通过W_TX_PAYLOAD或FLUSH_TX复位
#define M_NRF_BIT_FIFO_STATUS_TX_FULL   5   // TX FIFO寄存器满标志。1满；0未满
#define M_NRF_BIT_FIFO_STATUS_TX_EMPTY  4   // TX FIFO寄存器空标志。1空；0非空
#define M_NRF_BIT_FIFO_STATUS_RX_FULL   1   // RX FIFO寄存器满标志。1满；0未满
#define M_NRF_BIT_FIFO_STATUS_RX_EMPTY  0   // RX FIFO寄存器空标志。1空；0非空

// 操作指令

#define M_NRF_REG_READ      0x00 // 寄存器读指令，即：0000 0000
#define M_NRF_REG_WRITE     0x20 // 寄存器写指令，即：0010 0000
#define M_NRF_RX_READ       0x61 // 接收数据读指令，即：0110 0001
#define M_NRF_TX_WRITE      0xA0 // 发送数据写指令，即：1010 0000
#define M_NRF_TX_FLUSH      0xE1 // 清除TX FIFO寄存器，应用于发射模式下，即：1110 0001
#define M_NRF_RX_FLUSH      0xE2 // 清除RX FIFO寄存器，应用于接收模式下，即：1110 0010
#define M_NRF_TX_REUSE      0xE3 // 重新使用上一包有效数据，即：1110 0011
                                 // 当CE为高过程中，数据包被不断重新发送。在发射数据包过程中必须禁止数据包重复利用功能
#define M_NRF_NOP           0xFF // 空操作。可以用来读状态寄存器


int m_nrf_init();
int m_nrf_tx_mode();
int m_nrf_host_tx_data(unsigned char *data, int size);

#endif